/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.aqlm.util;

import java.util.Calendar;

/**
 *
 * @author hironaga
 */
public class CalendarUtil {
    
    /**
     * 指定の【年数】を加算・減算した結果を返します。
     * @param addYera 加算・減算する年数
     * @return    計算後の Calendar インスタンス。
     */
    public static Calendar addYear(Calendar cal, int addYera){
        return add(cal,addYera,0,0,0,0,0,0);
    }
    /**
     * 指定の【月数】を加算・減算した結果を返します。
     * @param addMonth 加算・減算する月数
     * @return    計算後の Calendar インスタンス。
     */
    public static Calendar addMonth(Calendar cal, int addMonth){
        return add(cal,0,addMonth,0,0,0,0,0);
    }
    /**
     * 指定の【日数】を加算・減算した結果を返します。
     * @param addDate 加算・減算する日数
     * @return    計算後の Calendar インスタンス。
     */
    public static Calendar addDate(Calendar cal, int addDate){
        return add(cal,0,0,addDate,0,0,0,0);
    }
    /**
     * 指定の【時間】を加算・減算した結果を返します。
     * @param addHour 加算・減算する時間
     * @return    計算後の Calendar インスタンス。
     */
    public static Calendar addHour(Calendar cal, int addHour){
        return add(cal,0,0,0,addHour,0,0,0);
    }
    /**
     * 指定の【分】を加算・減算した結果を返します。
     * @param addMinute 加算・減算する分
     * @return    計算後の Calendar インスタンス。
     */
    public static Calendar addMinute(Calendar cal, int addMinute){
        return add(cal,0,0,0,0,addMinute,0,0);
    }
    /**
     * 指定の【秒】を加算・減算した結果を返します。
     * @param addSecond 加算・減算する秒
     * @return    計算後の Calendar インスタンス。
     */
    public static Calendar addSecond(Calendar cal, int addSecond){
        return add(cal,0,0,0,0,0,addSecond,0);
    }
    /**
     * 現在の日付・時刻から指定の時間量を加算・減算した結果を返します。
     * 年、月、日、時間、分、秒、ミリ秒の各時間フィールドに対し、
     * 任意の時間量を設定できます。
     * たとえば、現在の日付時刻から 10 日前を計算する場合は以下となります。
     * Calendar cal = add(null,0,0,-10,0,0,0,0);
     * 
     * 各時間フィールドの値がその範囲を超えた場合、次の大きい時間フィールドが
     * 増分または減分されます。
     * たとえば、以下では1時間と5分進めることになります。
     * Calendar cal = add(null,0,0,0,0,65,0,0);
     * 
     * 各時間フィールドに設定する数量が0の場合は、現在の値が設定されます。
     * java.util.GregorianCalendarの内部処理では以下の分岐を行っている。
     *     if (amount == 0) {
     *         return;
     *     }
     *     
     * @param cal 日付時刻の指定があればセットする。
     *     nullの場合、現在の日付時刻で新しいCalendarインスタンスを生成する。
     * @param addYera 加算・減算する年数
     * @param addMonth 加算・減算する月数
     * @param addDate 加算・減算する日数
     * @param addHour 加算・減算する時間
     * @param addMinute 加算・減算する分
     * @param addSecond 加算・減算する秒
     * @param addMillisecond 加算・減算するミリ秒
     * @return    計算後の Calendar インスタンス。
     */
    public static Calendar add(Calendar cal,
                               int addYera,int addMonth,int addDate,
                               int addHour,int addMinute,int addSecond,
                               int addMillisecond){
        if (cal == null) {
            return null;
        }
        cal.add(Calendar.YEAR, addYera);
        cal.add(Calendar.MONTH, addMonth);
        cal.add(Calendar.DATE, addDate);
        cal.add(Calendar.HOUR_OF_DAY, addHour);
        cal.add(Calendar.MINUTE, addMinute);
        cal.add(Calendar.SECOND, addSecond);
        cal.add(Calendar.MILLISECOND, addMillisecond);
        return cal;
    }
    
    /**
     * 現在日付のカレンダーを返します。
     * @return
     */
    public static Calendar getCalendar(){
        return Calendar.getInstance();
    }
    
    /**
     * 指定した年月日のカレンダーを返します
     * @param year
     * @param month
     * @param day
     * @return
     */
    public static Calendar getCalendar(int year, int month, int date){
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, date);
        return cal;
    }

    /**
     * 指定した年月日時間のカレンダーを返します
     * @param year
     * @param month
     * @param day
     * @return
     */
    public static Calendar getCalendar(int year, int month, int date, int hour, int minute, int sec){
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, date, hour, minute, sec);
        return cal;
    }
    
    /**
     * 年を返す
     * @param cal
     * @return
     */
    public static int getYear(Calendar cal){
        return cal.get(Calendar.YEAR);
    }
    
    /**
     * 月を返す
     * @param cal
     * @return
     */
    public static int getMonth(Calendar cal){
        return cal.get(Calendar.MONTH);
    }
    
    /**
     * 月を返す
     * @param cal
     * @return
     */
    public static int getRealMonth(Calendar cal){
        return cal.get(Calendar.MONTH) + 1;
    }
    
    /**
     * 日を返す
     * @param cal
     * @return
     */
    public static int getDate(Calendar cal){
        return cal.get(Calendar.DATE);
    }
    
    /**
     * 時間を返す
     * @param cal
     * @return
     */
    public static int getHour(Calendar cal){
        return cal.get(Calendar.HOUR);
    }
    
    /**
     * 分を返す
     * @param cal
     * @return
     */
    public static int getMinute(Calendar cal){
        return cal.get(Calendar.MINUTE);
    }
    
    /**
     * 秒を返す
     * @param cal
     * @return
     */
    public static int getSecond(Calendar cal){
        return cal.get(Calendar.SECOND);
    }
    
    /**
     * ミリ秒を返す
     * @param cal
     * @return
     */
    public static int getMilliSecond(Calendar cal){
        return cal.get(Calendar.MILLISECOND);
    }
    
    /**
     * 曜日を返す
     * @param cal
     * @return
     */
    public static String getDayOfWeek(Calendar cal){
        
        String dow = null;
        switch (cal.get(Calendar.DAY_OF_WEEK)) {  //現在の曜日を取得
          case Calendar.SUNDAY: dow = "日";  break;
          case Calendar.MONDAY: dow = "月"; break;
          case Calendar.TUESDAY: dow = "火"; break;
          case Calendar.WEDNESDAY: dow = "水"; break;
          case Calendar.THURSDAY: dow = "木"; break;
          case Calendar.FRIDAY: dow = "金"; break;
          case Calendar.SATURDAY: dow = "土"; break;
        }
        return dow;
    }
    
    /**
     * 月末を返す
     * @param cal
     * @return
     */
    public static int getLastDateOfMonth(Calendar cal){
        return cal.getActualMaximum(Calendar.DATE);
    }
    
}
